// This file is part of The Grinder software distribution. Refer to
// the file LICENSE which is part of The Grinder distribution for
// licensing details. The Grinder distribution is available on the
// Internet at http://grinder.sourceforge.net/

package mitm;


/**
 * ConnectionDetails represents the endpoints of a TCP connection,
 * and whether SSL is used.
 *
 */
public class ConnectionDetails {

	private final int m_hashCode;

	private String m_localHost;
	private int m_localPort;
	private String m_remoteHost;
	private int m_remotePort;
	private boolean m_isSecure;

	/**
	 * Creates a new ConnectionDetails instance.
	 */
	public ConnectionDetails(String localHost, int localPort,
			String remoteHost, int remotePort,
			boolean isSecure)
	{
		m_localHost = localHost.toLowerCase();
		m_localPort = localPort;
		m_remoteHost = remoteHost.toLowerCase();
		m_remotePort = remotePort;
		m_isSecure = isSecure;

		m_hashCode =
				m_localHost.hashCode() ^
				m_remoteHost.hashCode() ^
				m_localPort ^
				m_remotePort ^
				(m_isSecure ? 0x55555555 : 0);
	}

	public String getDescription() {
		return
				m_localHost + ":" + m_localPort + "->" +
				m_remoteHost + ":" + m_remotePort;
	}

	public boolean isSecure() {
		return m_isSecure;
	}

	public String getRemoteHost() {
		return m_remoteHost;
	}

	public String getLocalHost() {
		return m_localHost;
	}

	public int getRemotePort() {
		return m_remotePort;
	}

	public int getLocalPort() {
		return m_localPort;
	}

	/**
	 * Value based equality.
	 *
	 * @param other an <code>Object</code> value
	 * @return <code>true</code> => <code>other</code> is equal to this object.
	 *
	 */
	public boolean equals(Object other) {
		if (other == this) {
			return true;
		}

		if (!(other instanceof ConnectionDetails)) {
			return false;
		}

		final ConnectionDetails otherConnectionDetails = (ConnectionDetails)other;

		return
				hashCode() == otherConnectionDetails.hashCode() &&
				getLocalPort() == otherConnectionDetails.getLocalPort() &&
				getRemotePort() == otherConnectionDetails.getRemotePort() &&
				isSecure() == otherConnectionDetails.isSecure() &&
				getLocalHost().equals(otherConnectionDetails.getLocalHost()) &&
				getRemoteHost().equals(otherConnectionDetails.getRemoteHost());
	}

	public final int hashCode() {
		return m_hashCode;
	}

}
